﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Workshop2
{
    enum PersonReadStatus
    {
        New,
        Id,
        Name,
        SSN,
        Antal,
        BoatType,
        BoatLength
    }
    class Repository
    {
        private IList<Person> _myPersonList;
        PersonReadStatus flag;

        public Repository()
        {
            _myPersonList = LoadSpecific();
        }
        // Enum som sätter vilket läge vi är i
        public IList<Person> getPersons()
        {
            return _myPersonList;
        }

    
        // Laddar upp fil i en List av klassen Person
        public IList<Person> LoadSpecific()
        {
            //int count = 0;
            List<Person> myPersonList = new List<Person>();
            List<Boat> myBoatList = new List<Boat>();
            using (StreamReader reader = new StreamReader("fil.txt"))
            {
                string line;
                // line är en string variabel som skriver ut vad som står i filen
                while ((line = reader.ReadLine()) != null)
                {
                    // Så om texten är [Member] i filen så blir enum-statusen New
                    if (line == "[Member]")
                    {
                        //count = 0;
                        flag = PersonReadStatus.New;
                    }
                    if (line == "[Medlemsnummer]")
                    {
                        flag = PersonReadStatus.Id;
                    }
                    if (line == "[Namn]")
                    {
                        flag = PersonReadStatus.Name;

                    }
                    if (line == "[Personnummer]")
                    {
                        flag = PersonReadStatus.SSN;

                    }
                    if (line == "[Antal]")
                    {
                        flag = PersonReadStatus.Antal;
                    }
                    if (line == "[BåtTyp]")
                    {
                        flag = PersonReadStatus.BoatType;
                    }
                    if(line == "[BåtLängd]"){
                        flag = PersonReadStatus.BoatLength; 
                    }
                    else
                    {
                        // Sen kollar de va enum-statusen är och skriver in de i rätt ordning.
                        if (flag == PersonReadStatus.New)
                        {
                            myPersonList.Add(new Person(line));
                        }
                        else if (flag == PersonReadStatus.Id)
                        {
                            myPersonList.Last().setID(line);

                            // Här sätter vi den statiska id så alla får ett unikt id
                            if (line != "[Medlemsnummer]")
                            {

                                Person._id = int.Parse(line);

                            }
                        }
                        else if (flag == PersonReadStatus.Name)
                        {
                            myPersonList.Last().setName(line);
                        }
                        else if (flag == PersonReadStatus.SSN)
                        {
                            myPersonList.Last().setSSN(line);
                        }
                        else if (flag == PersonReadStatus.Antal)
                        {
                            
                            // count++;
                            if (line != "[Antal]")
                            {
                                myPersonList.Last().setNumberOf(int.Parse(line));
                            }
                           

                        }

                        else if (flag == PersonReadStatus.BoatType)
                        {
                            if (line != "[BåtTyp]")
                            {
                                myBoatList.Add(new Boat(line));
                                myPersonList.Last().setBoat(myBoatList.Last());
                            }
                        }
                        else if (flag == PersonReadStatus.BoatLength)
                        {
                            if (line != "[BåtLängd]")
                            {
                                myBoatList.Last().setLength(double.Parse(line));
                            }
                        }

                    }
                }
                
                // Sorterar efter ID med IComparible
                myPersonList.Sort();
                // Retunerar List fylld med Person-Objekt
                return myPersonList;
            }
        }

        // Sparar Person i filen
        public void Save(IList<Person> person)
        {
            using (StreamWriter rSave = new StreamWriter("fil.txt")) // Här sparas personen.
            {
                // Skriver in i filen i denna ordning. 
                foreach (Person persons in person)
                {
                    List<Boat> boat = persons.getBoat();
                    rSave.WriteLine("[Member]");
                    rSave.WriteLine("[Medlemsnummer]");
                    rSave.WriteLine(persons.getID());
                    rSave.WriteLine("[Namn]");
                    rSave.WriteLine(persons.getName());
                    rSave.WriteLine("[Personnummer]");
                    rSave.WriteLine(persons.getSSN());
                    rSave.WriteLine("[Antal]");
                    rSave.WriteLine(persons.getAntal());

                    if (boat != null)
                    {

                        foreach (Boat boats in boat)
                        {
                            rSave.WriteLine("[BåtTyp]");
                            rSave.WriteLine(boats.getType());
                            rSave.WriteLine("[BåtLängd]");
                            rSave.WriteLine(boats.getLength());

                        }
                    }
                    
                }
                rSave.Close();
            }
        }
    }
}
